using System;
using System.Collections.Generic;
using System.Text;

namespace RRHH.Competencias.Entities
{
    public class Colaborador : Persona
    {
        private long colaborador_id;
        private string legajo;
        private DateTime fechaIngreso;
        private string observaciones;
        private DateTime fechaBaja;
        private MotivoBajaColaborador motivoBaja;
        private string observacionesBaja;
        private List<Puesto> puestos;
        private List<Capacidad> capacidadesActuales;
        private Sector sector;
        private string rutaImagenPerfil;

        public Colaborador() 
            : base() 
        {
            //motivoBaja = new MotivoBajaColaborador();
            puestos = new List<Puesto>();
            capacidadesActuales = new List<Capacidad>();
            //ciclo = new Ciclo();
        }

        public Colaborador(long id, string apellido, string nombre) : base(id, apellido, nombre) {}

        public Colaborador(long colaborador_id)
        {
            this.colaborador_id = colaborador_id;
        }

        #region Propiedades
        public long IdColaborador
        {
            get { return colaborador_id; }
            set { colaborador_id = value; }
        }

        public string Legajo
        {
            get { return legajo; }
            set { legajo = value; }
        }

        public DateTime FechaIngreso
        {
            get { return fechaIngreso; }
            set { fechaIngreso = value; }
        }

        public string Observaciones
        {
            get { return observaciones; }
            set { observaciones = value; }
        }

        public DateTime FechaBaja
        {
            get { return fechaBaja; }
            set { fechaBaja = value; }
        }

        public MotivoBajaColaborador MotivoBaja
        {
            get { return motivoBaja; }
            set { motivoBaja = value; }
        }

        public string ObservacionesBaja
        {
            get { return observacionesBaja; }
            set { observacionesBaja = value; }
        }

        public List<Puesto> Puestos
        {
            get { return puestos; }
        }

        public Sector Sector
        {
            get { return sector; }
            set { sector = value; }
        }

        public long SectorId
        {
            get
            {
                if (sector == null || sector.Id > 0) return sector.Id;
                return 0;
            }
        }
        public string SectorDescripcion
        {
            get
            {
                if (sector == null || !string.IsNullOrEmpty(sector.Nombre)) return sector.Nombre;
                return string.Empty;
            }
        }

        public string RutaImagenPerfil
        {
            get { return rutaImagenPerfil; }
            set { rutaImagenPerfil = value; }
        }

        public bool Activado
        {
            get { return fechaBaja == DateTime.MinValue; }
        }

        /// <summary>
        /// Capacidades del Colaborador, independientes de su puesto
        /// </summary>
        public List<Capacidad> CapacidadesActuales
        {
            get { return capacidadesActuales; }
        }

        /// <summary>
        /// Capacidades requeridas, segun el puesto que ocupa el colaborador
        /// </summary>
        public List<Capacidad> CapacidadesRequeridas
        {
            get
            {
                List<Capacidad> capacidadesPuesto = new List<Capacidad>();

                if (ContarPuestos() > 0)
                {
                    foreach (Puesto puesto in puestos) capacidadesPuesto.AddRange(puesto.CapacidadesRequeridas);
                }

                return capacidadesPuesto;
            }
        }
        #endregion

        #region Metodos
        public void AgregarPuesto(Puesto puesto)
        {
            if (puestos == null) puestos = new List<Puesto>();
            puestos.Add(puesto);
        }

        public void QuitarPuesto(Puesto puesto)
        {
            if (puestos == null) return;
            puestos.Remove(puesto);
        }

        public int ContarPuestos()
        {
            if (puestos == null) return 0;
            return puestos.Count;
        }

        public void AgregarCapacidadActual(Capacidad capacidad)
        {
            if (capacidadesActuales == null) capacidadesActuales = new List<Capacidad>();
            capacidadesActuales.Add(capacidad);
        }

        public void QuitarCapacidadActual(Capacidad capacidad)
        {
            if (capacidadesActuales == null) return;
            CapacidadesActuales.Remove(capacidad);
        }

        public int ContarCapacidadesActuales()
        {
            if (capacidadesActuales == null) return 0;
            return capacidadesActuales.Count;
        }
        #endregion
    }
}
